/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controller;

import Model.Produto;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author iron
 */
public class ProdutoDAO {
    public static final ProdutoDAO INSTANCE  = new ProdutoDAO();
    private BancoDeDados bd = new BancoDeDados();
    private int lastId;
    private ArrayList<Produto> listaProdutos;
    
    public ProdutoDAO(){
        loadLastId();
        listaProdutos = listarProdutos();
    }

    private void loadLastId() {
        try{
        bd.conectar();
        bd.sql="SELECT id FROM \"Produto\" ORDER BY id DESC LIMIT 1";
        bd.comandoSql = bd.connection.prepareStatement(bd.sql);
        ResultSet rs = bd.comandoSql.executeQuery();                  
        lastId = !rs.next()? 1 : rs.getInt(1);
         bd.desconectar();
        }catch(Exception ex){            
            ex.printStackTrace();           
        }
    }
    
    public Produto findById(int id) throws SQLException, Exception{
        bd.conectar();
        Produto produto = null;
        bd.sql = "SELECT * FROM \"Produto\" WHERE \"id\" = ?";
        bd.comandoSql = bd.connection.prepareStatement(bd.sql);
        bd.comandoSql.setInt(1, id);
        ResultSet rs = bd.comandoSql.executeQuery();         
        rs.next();            
        
        String nome = rs.getString(1);
        String lote = rs.getString(3);
        String fornecedor = rs.getString(4);
        String fabricante = rs.getString(5);
        Double valor = rs.getDouble(6);
        char tipo =((String)rs.getObject(7)).charAt(0);
        Boolean exigeReceita = rs.getBoolean(8);
        
        produto = new Produto(id, nome, lote, fornecedor, fabricante, valor, tipo, exigeReceita);
        
        bd.desconectar();
        
        return produto;
    }
    
    public Produto findByNome(String nome) throws SQLException, Exception{
        bd.conectar();
        Produto produto = null;
        bd.sql = "SELECT * FROM \"Produto\" WHERE \"nome\" = ?";
        bd.comandoSql = bd.connection.prepareStatement(bd.sql);
        bd.comandoSql.setString(1, nome);
        ResultSet rs = bd.comandoSql.executeQuery();         
        rs.next();            
        
        Integer id = rs.getInt(2);
        String lote = rs.getString(3);
        String fornecedor = rs.getString(4);
        String fabricante = rs.getString(5);
        Double valor = rs.getDouble(6);
        char tipo =((String)rs.getObject(7)).charAt(0);
        Boolean exigeReceita = rs.getBoolean(8);
        
        produto = new Produto(id, nome, lote, fornecedor, fabricante, valor, tipo, exigeReceita);
        
        bd.desconectar();
        
        return produto;
    }
    
    public void delete(int id) throws Exception{ 
        bd.conectar();
        bd.sql = "DELETE FROM \"Produto\" WHERE \"id\" = ?";
        bd.comandoSql = bd.connection.prepareStatement(bd.sql);
        bd.comandoSql.setInt(1, id);
        bd.comandoSql.executeUpdate();        
        bd.desconectar();
        listaProdutos = listarProdutos();
    }
    
    public void insert(String nome, String lote, String fornecedor, String fabricante ,Double valor, char tipo, Boolean exigeReceita) throws SQLException, Exception{
        bd.conectar();
        bd.sql = "INSERT INTO \"Produto\" values (?,?,?,?,?,?,?,?)";
        bd.comandoSql = bd.connection.prepareStatement(bd.sql);
        bd.comandoSql.setString(1, nome);
        bd.comandoSql.setInt(2, ++lastId);
        bd.comandoSql.setString(3, lote);
        bd.comandoSql.setString(4, fornecedor);
        bd.comandoSql.setString(5, fabricante);
        bd.comandoSql.setDouble(6, valor);
        bd.comandoSql.setObject(7, tipo);
        bd.comandoSql.setBoolean(8, exigeReceita);        
        bd.comandoSql.executeUpdate();
        bd.desconectar();
        listaProdutos = listarProdutos();
    }
        
    public ArrayList<Produto> listarProdutos(){
        listaProdutos = new ArrayList<Produto>();
        try{
        bd.conectar();
        bd.sql = "SELECT * FROM \"Produto\"";
        bd.comandoSql = bd.connection.prepareStatement(bd.sql);
        ResultSet rs = bd.comandoSql.executeQuery();         
        
        String nome;
        int id;
        String lote;
        String fornecedor;
        String fabricante;
        Double valor;
        char tipo;
        Boolean exigeReceita;
        Produto produto;
        while(rs.next()){
            nome = rs.getString(1);
            id = rs.getInt(2);
            lote = rs.getString(3);
            fornecedor = rs.getString(4);
            fabricante = rs.getString(5);
            valor = rs.getDouble(6);
            tipo = ((String)rs.getObject(7)).charAt(0);
            exigeReceita = rs.getBoolean(8);
            produto = new Produto(id, nome, lote, fornecedor, fabricante, valor, tipo, exigeReceita);
            listaProdutos.add(produto);
        }            
        bd.desconectar();
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return listaProdutos;
    }
    
    public ArrayList<Produto> listarMedicamentos() throws SQLException, Exception{
        ArrayList<Produto> lista = new ArrayList<Produto>();
        bd.conectar();
        bd.sql = "select * from \"Produto\" where \"tipo\" = 'M'";
        bd.comandoSql = bd.connection.prepareStatement(bd.sql);
        ResultSet rs = bd.comandoSql.executeQuery();         
        
        String nome;
        int id;
        String lote;
        String fornecedor;
        String fabricante;
        Double valor;
        char tipo;
        Boolean exigeReceita;
        Produto produto;
        while(rs.next()){
            nome = rs.getString(1);
            id = rs.getInt(2);
            lote = rs.getString(3);
            fornecedor = rs.getString(4);
            fabricante = rs.getString(5);
            valor = rs.getDouble(6);
            tipo = ((String)rs.getObject(7)).charAt(0);
            exigeReceita = rs.getBoolean(8);
            produto = new Produto(id, nome, lote, fornecedor, fabricante, valor, tipo, exigeReceita);
            lista.add(produto);
        }            
        bd.desconectar();
        return lista;
    }
    
    public ArrayList<Produto> listarCosmeticos() throws SQLException, Exception{
        ArrayList<Produto> lista = new ArrayList<Produto>();
        bd.conectar();
        bd.sql = "select * from \"Produto\" where \"tipo\" = 'C'";
        bd.comandoSql = bd.connection.prepareStatement(bd.sql);
        ResultSet rs = bd.comandoSql.executeQuery();         
        
        String nome;
        int id;
        String lote;
        String fornecedor;
        String fabricante;
        Double valor;
        char tipo;
        Boolean exigeReceita;
        Produto produto;
        while(rs.next()){
            nome = rs.getString(1);
            id = rs.getInt(2);
            lote = rs.getString(3);
            fornecedor = rs.getString(4);
            fabricante = rs.getString(5);
            valor = rs.getDouble(6);
            tipo = ((String)rs.getObject(7)).charAt(0);
            exigeReceita = rs.getBoolean(8);
            produto = new Produto(id, nome, lote, fornecedor, fabricante, valor, tipo, exigeReceita);
            lista.add(produto);
        }            
        bd.desconectar();
        return lista;
    }

    public ArrayList<Produto> getListaProdutos() {
        return listaProdutos;
    }

    public void setListaProdutos(ArrayList<Produto> listaProdutos) {
        this.listaProdutos = listaProdutos;
    }
    
   
}
